package com.my.springboot.tuling.concurrent.thread;

/**
 *使用wait/notify阻塞唤醒线程
 * 1、wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象，这限制了其使用场合:只能在同步代码块中。
 * 2、当对象的等待队列中有多个线程时，notify只能随机选择一个线程唤醒，无法唤醒指定的线程
 *
 * 使用LockSupport的话，我们可以在任何场合使线程阻塞，同时也可以指
 * 定要唤醒的线程，相当的方便
 */
public class WaitTest {

    public void testWaitMethod(Object lock) {
        try {
            synchronized (lock) {
                System.out.println(Thread.currentThread().getName()+" begin wait()");
                // wait() 释放锁资源
                Thread.sleep(5000);
                lock.wait();
                System.out.println(Thread.currentThread().getName()+" end wait()");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void testNotifyMethod(Object lock) {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName()+" begin notify()");
            lock.notify();
            System.out.println(Thread.currentThread().getName()+" end notify()");
        }
    }

    public static void main(String[] args) {
        Object lock = new Object();
        WaitTest test = new WaitTest();
        new Thread(() -> test.testWaitMethod(lock),"threadA").start();
        new Thread(() -> test.testNotifyMethod(lock),"threadB").start();

        try {
            Thread.sleep(500000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}